package com.tangruojie.service.impl;

import com.tangruojie.dao.BookDao;
import com.tangruojie.domain.Book;
import com.tangruojie.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 为什么写在接口上通常不生效？
 * Spring 默认使用的是 基于动态代理（JDK Proxy）或 CGLIB 代理机制 来实现事务管理，而事务是通过拦截实现类中的方法调用来生效的。
 */
@Service
@Transactional
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;

    public boolean save(Book book) {
        return bookDao.save(book) > 0;
    }

    public boolean update(Book book) {
        return bookDao.update(book) > 0;
    }

    public boolean delete(Integer id) {
        return bookDao.delete(id) > 0;
    }

    public Book getById(Integer id) {

        /**
         * 将可能出现的异常进行包装，转换为自定义异常
         */

//        if (id == 1) {
//            /**
//             * 业务异常
//             */
//            throw new BusinessException("业务异常", Code.BUSINESS_ERR);
//        }
//
//        try {
//            int i = 1 / 0;
//        } catch (Exception e) {
//            /**
//             * 系统异常
//             */
//            throw new SystemException("系统异常", e, Code.SYSTEM_ERR);
//        }

        return bookDao.getById(id);
    }

    public List<Book> getAll() {
        return bookDao.getAll();
    }

}
